La OMS ha dispuesto que para considerarse “saludable” una ciudad debe poseer al menos 15m2 de espacios verdes por habitante, sorprendente y lamentablemente Villa Allende “la entrada de las sierras”, ciudad históricamente reconocida por sus bellos paisajes y su naturaleza, está lejos de ese número.

Por ello el motivo de este proyecto es poder visualizar la relación entre cantidad de habitantes y espacios verdes, buscando determinar cuáles zonas son las más desfaborecidas en esta relación que hace a la calidad de vida. Además compararemos dicha disponibilidad de espacios verdes con otras características socioeconómicas para ver si existe o no relación.

Finalmente, como yapa, incorporaremos las orillas del río actualmente en un estado de lamentable abandono, a fin de observar cuanto impactaría en estos indicadores su recuperación para el uso de los vecinos como espacio verde.

Consideraciones iniciales

Para el desarrollo de nuestro proyecto utilizaremos las siguientes librerías

library(sf)
library(tidyverse)
library(osmdata)
library(units)
library(leaflet)
library(mapview)
library(ggmap)
library(kableExtra)
library(dplyr)

Para asegurarnos de arrancar con la memoria limpia de datasets viejos utilizamos la librería rm.

rm(list = ls())

Obtención de datos de nuestra ciudad

Datos geoespaciales

Para poder comenzar con nuestro proyecto, primero seleccionamos el bbox correspondiente a la localidad de Villa Allende.

bb_villa <- getbb("Villa Allende, Córdoba")

La definimos como polígono

allende_poly <- getbb("Municipio de Villa Allende, Córdoba", format_out = "sf_polygon")
class(allende_poly)
## [1] "sf"         "data.frame"

Además extraeremos un mapa de Villa Allende que usaremos como “Capa Base”. Para ello usaremos los mapas de Stamen Maps.

vabase <- get_stamenmap(bbox = bb_villa, 
                      maptype = "terrain", 
                      zoom=12)

Lo observamos

ggmap(vabase)

La extracción de los polígonos correspondientes a parques y espacios verdes la haremos desde el GeoServicio de OpenStreetmap, previamente realizamos un chequeo e incorporamos parques faltantes pudiendo observar que ciertos espacios como el polideportivo municipal cuyo uso es relevante para este proyecto se encontraban definidos como Sport Centre por lo que decidimos incorporar dicha categoría.

allende <- opq(bb_villa) %>% 
    add_osm_feature(key = "leisure", value = c("park", "sports_centre"))
allende
## $bbox
## [1] "-31.308457,-64.3248015,-31.2648675,-64.2209538"
## 
## $prefix
## [1] "[out:xml][timeout:25];\n(\n"
## 
## $suffix
## [1] ");\n(._;>;);\nout body;"
## 
## $features
## [1] " [\"leisure\"~\"^(park|sports_centre)$\"]"
## 
## attr(,"class")
## [1] "list"           "overpass_query"
## attr(,"nodes_only")
## [1] FALSE

Posteriormente a la extracción desde el geoservicio guardamos la información como sf en la variable allende

allende <- allende %>% 
    osmdata_sf()
allende

De la información extraida seleccionamos solamente los polígonos y los guardamos en la variable allende_plazas

allende_plazas <- allende$osm_polygons
head(allende_plazas) 
## Simple feature collection with 6 features and 5 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -64.30298 ymin: -31.30823 xmax: -64.23171 ymax: -31.26497
## Geodetic CRS:  WGS 84
##              osm_id                        name addr.city       leisure  sport
## 154075693 154075693    Polideportivo Mendiolaza      <NA> sports_centre   <NA>
## 154244319 154244319                        <NA>      <NA>          park   <NA>
## 157802440 157802440 Polideportivo Villa Allende      <NA>          park   <NA>
## 164874619 164874619                         ACV      <NA> sports_centre  motor
## 234370161 234370161                Club Quilmes      <NA> sports_centre soccer
## 268203974 268203974                        <NA>      <NA>          park   <NA>
##                                 geometry
## 154075693 POLYGON ((-64.30271 -31.264...
## 154244319 POLYGON ((-64.25701 -31.304...
## 157802440 POLYGON ((-64.29269 -31.291...
## 164874619 POLYGON ((-64.2348 -31.2804...
## 234370161 POLYGON ((-64.29927 -31.283...
## 268203974 POLYGON ((-64.28701 -31.307...

Listo! Ahora podemos hacer un mapa, para tener una primera aproximación.

allende_plazas <- st_intersection(allende_plazas, allende_poly)
ggmap(vabase) +
  geom_sf(data=allende_poly, inherit.aes = FALSE, fill = NA) +
  geom_sf(data = allende_plazas, inherit.aes = FALSE, color = "green")

El mapa refleja lo planteado anteriormente, la proporción de territorio dedicado a espacios verdes en la ciudad es muy baja.

Para mayor información calcularemos las áreas de dichos espacios verdes en m2 y los incorporaremos como una columna más dentro del dataset allende_plazas.

allende_plazas$area <-as.numeric(set_units(st_area(allende_plazas), m^2))

Datos Demográficos

La información vinculada a las características poblacionales de la ciudad puede ser obtenida de la página poblaciones.org realizada por Conicet, la cual sintetiza geográficamente la información proveniente de los últimos censos realizados.

densidad <- st_read("vadensidad1/dataset11601hwr14979.shp")
## Reading layer `dataset11601hwr14979' from data source 
##   `/home/pedro/Documentos/Drive/Facultad/Geolocalización_en_R/analisis_geoespacial_espaciosverdes/vadensidad1/dataset11601hwr14979.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 31 features and 60 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -64.31595 ymin: -31.30945 xmax: -64.23393 ymax: -31.26561
## Geodetic CRS:  WGS 84
head(densidad)
## Simple feature collection with 6 features and 60 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -64.31384 ymin: -31.29116 xmax: -64.27533 ymax: -31.26561
## Geodetic CRS:  WGS 84
##     REDCODE P_TOTAL P_A17 P_0A3 P_4A5 P_6A12 P_13A17 P_18A P_18A29 P_30A54
## 1 140211905     803   297    45    31    142      79   506     115     290
## 2 140211901     848   257    50    23    108      76   591     151     313
## 3 140211904     604   241    38    21    106      76   363      62     256
## 4 140211801     727   234    67    31     86      50   493     126     270
## 5 140211902     877   264    59    26    112      67   613     154     278
## 6 140211903     570   155    36    12     64      43   415      99     204
##   P_55A69 P_70A M_TOTAL M_A17 M_0A3 M_4A5 M_6A12 M_13A17 M_18A M_18A29 M_30A54
## 1      78    23     420   145    24    16     70      35   275      69     156
## 2      84    43     424   119    22     9     51      37   305      79     165
## 3      35    10     303   111    19    10     47      35   192      33     134
## 4      68    29     359   106    27    11     42      26   253      63     140
## 5     117    64     458   135    27    12     57      39   323      79     151
## 6      75    37     285    64    13     8     26      17   221      54     104
##   M_55A69 M_70A V_TOTAL V_A17 V_0A3 V_4A5 V_6A12 V_13A17 V_18A V_18A29 V_30A54
## 1      36    14     383   152    21    15     72      44   231      46     134
## 2      36    25     424   138    28    14     57      39   286      72     148
## 3      19     6     301   130    19    11     59      41   171      29     122
## 4      35    15     368   128    40    20     44      24   240      63     130
## 5      57    36     419   129    32    14     55      28   290      75     127
## 6      38    25     285    91    23     4     38      26   194      45     100
##   V_55A69 V_70A P18A_SIN_I P18A_PRIMA P18A_SECUN P18A_SOLOP P18A_SOLOS
## 1      42     9         10        495        454         41        212
## 2      48    18         27        552        436        116        223
## 3      16     4          5        354        336         18        130
## 4      33    14         26        462        311        151        182
## 5      60    28         67        540        291        249        196
## 6      37    12         15        398        333         65        154
##   P18A_TERCI P18A_UNIVE P4A5_ASIST P6A12_ASIS P1317_ASIS P1317_SIN_ P1829_ASIS
## 1         50        192         30        142         77         78         10
## 2         46        167         22        107         71         75         14
## 3         44        162         19        106         73         76          2
## 4         42         87         25         85         46         50          9
## 5         29         66         19        109         60         67         10
## 6         41        138         10         64         41         42          6
##   P1829_SIN_ P1425_ASIS P1425_SIN_ P1425 IDPROV    PROV IDDPTO  DPTO REDCODE_1
## 1         17         72         77   149     14 Córdoba  14021 Colón 140211905
## 2         33         68         86   173     14 Córdoba  14021 Colón 140211901
## 3          4         60         63   107     14 Córdoba  14021 Colón 140211904
## 4         51         44         79   124     14 Córdoba  14021 Colón 140211801
## 5         83         58        118   164     14 Córdoba  14021 Colón 140211902
## 6         20         39         48   101     14 Córdoba  14021 Colón 140211903
##   RADIOS_POB RADIOS_HOG RADIOS_LAT RADIOS_LON RADIOS_SUP
## 1        803        200  -31.27927  -64.28310      1.735
## 2        848        238  -31.27484  -64.29401      0.767
## 3        604        162  -31.27852  -64.28484      0.407
## 4        727        233  -31.28195  -64.30880      0.639
## 5        896        283  -31.28000  -64.30085      0.457
## 6        610        178  -31.28250  -64.29032      1.028
##                         geometry
## 1 POLYGON ((-64.29099 -31.265...
## 2 POLYGON ((-64.2913 -31.2713...
## 3 POLYGON ((-64.28706 -31.273...
## 4 POLYGON ((-64.30537 -31.280...
## 5 POLYGON ((-64.29955 -31.276...
## 6 POLYGON ((-64.2901 -31.2764...

Nos interesan solo los polígonos, el RADIOCODE y P_TOTAL así que filtramos

densidad <- select(densidad, REDCODE, P_TOTAL, geometry)

Primeros Cálculos

Rápidamente podemos calcular el área verde por habitante total.

areaverde <- sum(allende_plazas$area)
p_total <- sum(densidad$P_TOTAL)
verde_porhabitante <- areaverde / p_total

# Creamos un data.frame con esos 3 objetos
tabla = data.frame(areaverde, p_total, verde_porhabitante)

# Cambiamos el nombre de las columnas

tabla = rename(tabla, "Area verde" = areaverde, "Poblacion total" = p_total, "Espacio verde por hab." = verde_porhabitante)

tabla %>%
  kbl(caption = "Datos de Espacios verdes Ciudad de Villa Allende en m2" ) %>%
  kable_classic(full_width = F, html_font = "Cambria", font_size = 16)
Datos de Espacios verdes Ciudad de Villa Allende en m2
Area verde Poblacion total Espacio verde por hab.
285957 26961 10.60632

Hay un total de 285.957 m2 de espacio verde lo que corresponde a un total de 10m2 por habitante. Si bien es considerablemente menor a los 15m2 recomendados por la oms, posee mejores valores que muchas otras ciudades. Sin embargo recordemos que estamos tomando datos poblacionales correspondientes al censo del 2010, hoy la población estimada duplica ese número por lo que la relación espacio verde por habitante disminuyó drásticamente.

Ahora tenemos la información de la densidad poblacional, haremos un coropleth.

ggplot(data = densidad)+
  geom_sf(data = allende_poly) +
  geom_sf(aes(fill= P_TOTAL))+
  scale_fill_viridis_c() +
  labs(title = "Población total por radio censal año 2010",
       subtitle = "Ciudad de Villa Allende",
       caption = "Elaboración propia en base a datos de OpenStreetmap y Poblaciones.org \nlas zonas en blanco no poseían población registrada hasta 2010")+
  theme_void()

El dataset presenta ciertas ventajas y ciertas desventajas que vale la pena aclarar. Como ventaja está el hecho de que los radios censales coinciden aproximadamente con los límites de los barrios, digo aproximadamente porque hay excepciones leves, esto podemos saberlo porque por ser vecinos de la ciudad conocemos los límites y formas de los barrios. La desventaja está en el hecho de que por ser datos correspondientes al censo del 2010 existen zonas no delimitadas como pobladas que hoy en día se encuentran no solo pobladas sino que su población es importante, ya que coincide con el proceso de expanción y desarrollo inmobiliario de la ciudad. Dichas zonas son las que figuran en blanco

Ahora observaremos como se ve el mapa de los radios censales de la ciudad y los espacios verdes

ggplot()+
  geom_sf(data = allende_poly) +
  geom_sf(data = densidad$geometry) +
  geom_sf(data = allende_plazas, fill = "green") +
  labs(title = "Espacios verdes por radio censal año 2010",
       subtitle = "Ciudad de Villa Allende",
       caption = "Elaboración propia en base a datos de OpenStreetmap y Poblaciones.org")+
  theme_void()

La escala no ayuda así que utilizaremos un tipo de mapa interactivo

mapview(allende_plazas) +
  mapview(densidad$geometry, fill = NA)

Ahora cruzaremos dicho mapa con el mapa de cantidad de población

ggplot() +
  geom_sf(data = allende_poly) +
  geom_sf(data = densidad, aes(fill = P_TOTAL)) +
  geom_sf(data = allende_plazas, fill = "green") +
  labs(title = "Población total y espacios verdes por radio censal año 2010",
       subtitle = "Ciudad de Villa Allende", 
       caption = "Elaboración propia en base a datos de OpenStreetmap y Poblaciones.org \nlas zonas en blanco no poseían población registrada hasta 2010")+
  theme_void()

bin0 <- c(0,250, 500, 750, 1000, 1500, Inf)
binpal <- colorBin("RdYlGn", densidad$P_TOTAL, bins = bin0, pretty = FALSE, reverse = TRUE)
leaflet() %>% 
  setView(lng = -64.29207, lat = -31.29080, zoom = 13) %>% 
  addTiles() %>% 
  addPolygons(data=densidad, stroke=FALSE, smoothFactor = 0.2, fillOpacity = .8,
    color = ~binpal(P_TOTAL)) %>%
  addPolygons(data = allende_plazas, fill = "green") %>%
  addLegend(values = densidad$P_TOTAL, pal = binpal, title = "Población total por radio censal")

Muy interesante el mapa nos permite ver rápidamente sin avanzar en muchos cálculos que dos de los radios más poblados no poseen ninguna plaza!!

Afinando el Lápiz

Hasta el momento pudimos hacer una primera aproximación en este proceso de tratar de entender cómo se presenta la disponibilidad de espacios verdes en la ciudad de Villa Allende. Ahora bien, a fin de profundizar el análisis y continuando con el criterio planteado por la OMS sobre la disponibilidad de espacios verdes por cantidad de habitantes, veremos como se da esta relación en cada uno de los radios censales. Para ello haremos un dataset filtrando las columnas que nos interesan de densidad e incorporando en el mismo una columna donde registre la cantidad de plazas que caen en su interior. Finalmente incorporaremos una última columna donde sume los m2 de cada plaza correspondientes a cada radio censal.

Para quienes no conocen la ciudad de Villa Allende podrán rápidamente detectar que hay un gran polígono verde en el centro norte de la ciudad no delimitado, pero el mismo corresponde al Golf Club el cual no es público y por lo tanto no puede ser utilizado sino por socios, distinto es el caso del gran espacio verde de la zona sureste el cual se encuentra dentro del Country San Isidro por lo que no es accesible al total de la población pero siguiendo el criterio de usabilidad por parte de los vecinos del mismo barrio, el mismo está disponible para todos los vecinos que viven allí por lo que fue considerado pertinente.

a <- st_join(allende_plazas, densidad, join = st_within)
a <- a %>%
  group_by(REDCODE) %>%
  summarise(cantidad = n(), area_verde = sum(area, na.rm = TRUE)) %>%
  st_set_geometry(NULL)

Hacemos un left join para incorporar la información en densidad

densidad <- left_join(densidad, a)

Ahora graficamos!

ggplot() +
  geom_sf(data = allende_poly) +
  geom_sf(data=densidad, aes(fill= cantidad)) +
  scale_fill_viridis_c() +
  theme_void() +
  labs(title = "Cantidad de espacios verdes por radio censal",
       subtitle = "Ciudad de Villa Allende",
       fill = "Plazas por radio censal",
       caption = "Elaboración propia en base a datos de OpenStreetmap y Poblaciones.org \nlas zonas en blanco no poseían población registrada hasta 2010")

Se puede observar que hay muchos barrios sin plazas, 7 según los resultados visibles en el dataset generado.

Ahora para calcular el “area verde” por habitante creamos una nueva columna que divida area_verde sobre cantidad de habitantes del radio censal

densidad$verdepor_habitante <- densidad$area_verde / densidad$P_TOTAL

Ahora veamos como se ve el gráfico en funcion del “área verde” por habitante

ggplot() +
  geom_sf(data = allende_poly) +
  geom_sf(data=densidad, aes(fill= verdepor_habitante)) +
  scale_fill_viridis_c() +
  theme_void() +
  labs(title = "Cantidad de m2 verdes por habitante por cada radio censal",
       subtitle = "Ciudad de Villa Allende",
       fill = "M2 verdes por habitante",
       caption = "Elaboración propia en base a datos de OpenStreetmap y Poblaciones.org \nlas zonas en blanco no poseían población registrada hasta 2010")

Lo mismo pero en interactivo!

bin <- c(0, 1, 5, 10, 15, 20, 40, Inf)
paleta <- colorBin("RdYlGn", domain = densidad$verdepor_habitante, bins = bin, pretty = FALSE, reverse = FALSE)
leaflet() %>% 
  setView(lng = -64.29207, lat = -31.29080, zoom = 13) %>% 
  addTiles() %>% 
  addPolygons(data=densidad, stroke=FALSE, smoothFactor = 0.2, fillOpacity = .8,
    color = ~paleta(verdepor_habitante)) %>%
  addPolygons(data = allende_plazas, fill = "green") %>%
  addLegend(values = densidad$verdepor_habitante, pal = paleta, title = "Espacio verde por habitante en m2")

Bien ya observamos que hay radios que tienen varios espacios verdes, otros que tienen pocos y directamente algunos que no tienen.

Ahora tratando de ampliar un poco el criterio consideraremos la disancia al espacio verde más cercano. Para ello calcularemos el centroide de cada radio censal y de cada plaza, para luego calcular la distancia con st_nearest_feature

plazas_c <- st_point_on_surface(allende_plazas)
radios_c <- st_point_on_surface(densidad)
densidad <- densidad %>% #Tomamos de base el df densidad que contiene los poligonos de radios censales
  mutate(distancia=st_distance(radios_c, plazas_c[st_nearest_feature(radios_c, plazas_c),], by_element = TRUE)) %>% #Agregamos columna nueva con los valores del calculo de distancia entre centroidoes ;)
  mutate(distancia=as.numeric(distancia)) #Convertimos a número

Ahora graficamos

ggplot() + 
  geom_sf(data = allende_poly) +
  geom_sf(data = densidad, aes(fill = distancia), color = NA) +
  scale_fill_viridis_c() +
  labs(title = "Distancia a plaza más cercana",
       subtitle = "Ciudad Villa Allende",
       fill = "Distancia a plaza más cercana en m",
       caption = "Elaboración propia en base a datos de OpenStreetmap y Poblaciones.org \nlas zonas en blanco no poseían población registrada hasta 2010")+
  theme_void()

En interactivo.

bins <- c(0,50,100,250,500,1000,1500, Inf)
palet <- colorBin("RdYlGn", densidad$distancia, bins = bins, pretty = FALSE, reverse = TRUE)
leaflet() %>% 
  setView(lng = -64.29207, lat = -31.29080, zoom = 13) %>% 
  addTiles() %>% 
  addPolygons(data=densidad, stroke=FALSE, smoothFactor = 0.2, fillOpacity = 0.85,
    color = ~palet(distancia)) %>%
  addLegend(values = densidad$distancia, pal = palet, title = "Distancia a la plaza más cercana en m")

Este gráfico es sumamente interesante, puesto que nos permite observar que las zonas céntricas, si bien concentran la mayor cantidad de población son quienes poseen los espacios verdes más cerca, bastante similar a muchas otras ciudades.

¿Y la economía?

A quienes venimos de las ciencias sociales nos encanta preguntarnos cómo influyen los factores socioeconómicos en casi todas las demás variables a analizar, pero salvando el vicio profesional es súmamente interesante ver si la desigualdad en el acceso a espacios verdes (considerándolos como dijimos factores de la salud pública y la calidad de vida de la población) reproduce otro tipo de desigualdades. Para ello observaremos si existe o no relación entre la disponibilidad de espacios verdes, Necesidades Básicas y Estrato socioeconómico, ambos dataset obtenidos también de poblaciones.org

va_nbi <- st_read("vanbi/dataset8301hwr14979.shp")
## Reading layer `dataset8301hwr14979' from data source 
##   `/home/pedro/Documentos/Drive/Facultad/Geolocalización_en_R/analisis_geoespacial_espaciosverdes/vanbi/dataset8301hwr14979.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 31 features and 38 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -64.31595 ymin: -31.30945 xmax: -64.23393 ymax: -31.26561
## Geodetic CRS:  WGS 84
va_socioec <- st_read("villaallende_socioec/dataset19901hwr14979.shp")
## Reading layer `dataset19901hwr14979' from data source 
##   `/home/pedro/Documentos/Drive/Facultad/Geolocalización_en_R/analisis_geoespacial_espaciosverdes/villaallende_socioec/dataset19901hwr14979.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 29 features and 199 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -64.31595 ymin: -31.30945 xmax: -64.26885 ymax: -31.26561
## Geodetic CRS:  WGS 84
ggplot() + 
  geom_sf(data = allende_poly) +
  geom_sf(data = va_nbi, aes(fill = H_NBI/H_TOTAL *100), color = NA) +
  scale_fill_viridis_c() +
  labs(title = "Porcentaje de hogares con al menos una NBI",
       subtitle = "Ciudad Villa Allende",
       fill = "Hogares con al menos una NBI",
       caption = "Elaboración propia en base a datos de Poblaciones.org \nlas zonas en blanco no poseían población registrada hasta 2010")+
  theme_void()

Sumamente interesante la comparativa! podemos ver que existe muy poca relación ya que por ejemplo los radios de la zona norte son quienes poseen menor porcentaje de hogares con al menos una nbi (y corresponden a los barrios más adinerados de la ciudad) son al mismo tiempo quienes poseen más lejos la plaza más cercana. Pero tampoco podemos afirmar una correlación inversa ya que los radios del sur con un porcentaje medio de hogares con nbi les siguen en lejanía a las plazas más cercanas.

Veremos como se comporta con respecto al dataset de estrato socio económico

ggplot() + 
  geom_sf(data = allende_poly) +
  geom_sf(data = va_socioec, aes(fill = SEGMENTO), color = NA) +
  scale_fill_viridis_c() +
  labs(title = "Estrato socioeconómico de cada radio censal",
       subtitle = "Ciudad Villa Allende",
       fill = "Estrato socioeconómico",
       caption = "Elaboración propia en base a datos de Poblaciones.org \nlas zonas en blanco no poseían población registrada hasta 2010")+
  theme_void()

De los metadatos del dataset sabemos que los valores de la columna Segmento socioeconómico del radio corresponden a 1:Clase alta 2:Clase media alta 3:Clase media 4:Clase media baja 5:Populares 6:Muy pobres 7:Indigente 99:Disperso

table(va_socioec$SEGMENTO)
## 
## 1 2 3 4 5 6 7 
## 4 5 5 9 2 1 3
va_socioec$estrato <- as.factor(va_socioec$SEGMENTO)
str(va_socioec$estrato)
##  Factor w/ 7 levels "1","2","3","4",..: 1 4 1 4 4 1 7 5 4 2 ...
va_socioec$estrato <- factor(va_socioec$estrato,
                             levels = levels(va_socioec$estrato),
                             labels = c("Clase alta", "Clase media alta", "Clase media", "Clase media baja", "Populares", "Muy pobres", "Indigente"))

table(va_socioec$estrato)
## 
##       Clase alta Clase media alta      Clase media Clase media baja 
##                4                5                5                9 
##        Populares       Muy pobres        Indigente 
##                2                1                3

Categorizaremos también la distancia a la plaza más cercana. Para ello primero hacemos un join con el dataset densidad donde teníamos guardada la columna distancia

va_socioec <- select(va_socioec, REDCODE, SEGMENTO, estrato)
va_socioec <- st_join(densidad, va_socioec)

Luego creamos una columna con los valores categorizados de la distancia usando cut

va_socioec$dist_plaza <- cut(va_socioec$distancia,
                             breaks = c(0, 100, 500, 750, 1000, Inf),
                             labels = c("Muy Cerca", "Cerca", "Media", "Lejos", "Muy lejos"),
                             right = FALSE)
lab <- c("Clase alta", "Clase media alta", "Clase media", "Clase media baja", "Populares", "Muy pobres", "Indigente")
bin1 <- c(1,2,3,4,5,6,7)
paletaa <- colorBin("viridis", va_socioec$SEGMENTO, bins = bin1, pretty = FALSE)
leaflet() %>% 
  setView(lng = -64.29207, lat = -31.29080, zoom = 13) %>% 
  addTiles() %>% 
  addPolygons(data=va_socioec, stroke=TRUE, smoothFactor = 0.2, fillOpacity = .8,
    color = ~paletaa(SEGMENTO),
    highlight = highlightOptions(weight = 3, color = "red", bringToFront = TRUE),
    popup = ~paste0("Distancia plaza: ",va_socioec$dist_plaza, "<br/>", "Estrato social: ",va_socioec$estrato)) 

Como consideraciones respecto al gráfico anterior, hay radios censales en los que el dataset de poblaciones.org no muestra registros que corresponden a los dos barrios cerrados situados sobre la av. Padre Luchesse al sureste, sin embargo por las características socioeconómicas de los mismos corresponderían a los denominados clase alta.

Bueno ahora la yapa!

Vamos a calcular qué impacto tendría la recuperación de la cuenca del río y sus orillas como espacio verde para ser utilizado y aprovechado por los vecinos En este sentido utilizando el mapa de riesgo generado por IDECOR donde clasifica las zonas de la cuenca del río por ser más o menos inundables, consideramos como criterio seleccionar la zona cuyo riesgo de inundación es alto, entendiendo que debería ser esta la que se transforme en espacio verde mejorando así los indicadores de m2 verde por habitante que venimos trabajando y disminuyendo además las potencialidad de consecuencias trágicas en una eventual inundación ya que el sector altamente inundable que pasaría a ser espacio verde, funcionaría también como “zona de absorción”.

Para ello primero descargamos la información relativa a la cuenca del río

rio <- st_read("WFS:https://idecor-ws.mapascordoba.gob.ar/geoserver/idecor/Villa_Allende_Riesgo_Inundacion/wfs?getcapabilities")
## Reading layer `idecor:Villa_Allende_Riesgo_Inundacion' from data source 
##   `WFS:https://idecor-ws.mapascordoba.gob.ar/geoserver/idecor/Villa_Allende_Riesgo_Inundacion/wfs?getcapabilities' 
##   using driver `WFS'
## Simple feature collection with 3 features and 3 fields
## Geometry type: MULTISURFACE
## Dimension:     XY
## Bounding box:  xmin: 4374700 ymin: 6536040 xmax: 4377250 ymax: 6540300
## Projected CRS: POSGAR 98 / Argentina 4

Lo transformamos a WGS 84

rio <- st_transform(rio, crs = st_crs(3857))
rio
## Simple feature collection with 3 features and 3 fields
## Geometry type: MULTISURFACE
## Dimension:     XY
## Bounding box:  xmin: -7159625 ymin: -3672889 xmax: -7156647 ymax: -3667897
## Projected CRS: WGS 84 / Pseudo-Mercator
##                              gml_id grado descripción
## 1 Villa_Allende_Riesgo_Inundacion.1     2       Medio
## 2 Villa_Allende_Riesgo_Inundacion.2     3        Alto
## 3 Villa_Allende_Riesgo_Inundacion.3     1        Bajo
##                             geom
## 1 MULTISURFACE (POLYGON ((-71...
## 2 MULTISURFACE (POLYGON ((-71...
## 3 MULTISURFACE (POLYGON ((-71...

Ahora vamos a ver como se ve junto al mapa de Villa Allende

ggplot() +
  geom_sf(data = allende_poly) +
  geom_sf(data = rio, aes(fill = descripción)) +
  geom_sf(data = allende_plazas, fill= "orange") +
  geom_sf(data = densidad, fill= NA) +
  theme_void()

Observamos que la cuenca del río cubre una gran superficie de la ciudad, ahora bien nos interesa seleccionar solo la zona de alto riesgo.

zonainund <- rio[rio$descripción == "Alto",]
ggplot() +
  geom_sf(data = allende_poly) +
  geom_sf(data = allende_plazas, fill= "green") +
  geom_sf(data = densidad, aes(fill = P_TOTAL)) +
  geom_sf(data = zonainund, colour = "green", fill = "lightgreen", fillOpacity = .001) +
  theme_void()

Listo! Podemos observar a simple vista cuánto espacio verde ganaría la ciudad si transformara la zona altamente inundable en parques! Además vemos que este sector del río abarca las zonas más pobladas de la ciudad.

Ahora vamos a calcularlo

rio$area_rio <- as.numeric(set_units(st_area(rio), m^2))
areainund <- as.numeric(set_units(st_area(zonainund), m^2))

# Creamos un data.frame con esos 3 objetos
tabla2 = data.frame(areainund, areaverde)

# Cambiamos el nombre de las columnas

tabla2 = rename(tabla2, "Area verde" = areaverde, "Area Inundable" = areainund)

tabla2 %>%
  kbl(caption = "Espacios verdes y zona inundable Ciudad de Villa Allende en m2" ) %>%
  kable_classic(full_width = F, html_font = "Cambria", font_size = 16)
Espacios verdes y zona inundable Ciudad de Villa Allende en m2
Area Inundable Area verde
1654799 285957

Veamoslo en proporción y por habitante

propor <- areainund/areaverde *100

area_total_porhabitante <- (areainund + areaverde) / p_total

tabla3 = data.frame(areaverde, areainund, propor, area_total_porhabitante)

tabla3 = rename(tabla3, "Area verde" = areaverde, "Area Inundable" = areainund, "Espacio verde total por hab." = area_total_porhabitante, "Proporción" = propor)

tabla3 %>%
  kbl(caption = " Espacios verdes y zona Inundable Ciudad de Villa Allende en m2" ) %>%
  kable_classic(full_width = F, html_font = "Cambria", font_size = 16)
Espacios verdes y zona Inundable Ciudad de Villa Allende en m2
Area verde Area Inundable Proporción Espacio verde total por hab.
285957 1654799 578.6883 71.98384

Impactante, incorporar el área inundable implicaría un 578% más de espacios verdes y llevaría a tener 71m2 verdes por habitante, ¿un sueño no?

Queda pendiente ver cómo se comportaría por radio censal, he probado varias cuestiones pero no he podido resolver el problema vinculado a que el polígono del río aparece como desconocido. Si pudieran brindarme alguna sugerencia para poder hacer un st_join y cuantificar qué área de la costa del río cae en cada radio censal a fin de sumarla como espacio verde y ver como impactaría en la cantidad de espacios verdes de cada uno se los agradecería mucho!

# #zonainund <-  st_transform(zonainund, crs = st_crs(4326))
# 
# radios <- select(densidad, REDCODE, geometry) %>%
#   st_transform(radios, crs = st_crs(3857))
# nvodf <- st_intersection(radios, zonainund)

Desde aquí muchísimas gracias por el curso la verdad que fué sumamente enriquecedor y me voy muy contento con lo aprendido y con ganas de seguir aprendiendo! Abrazo gigante!